from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import generics
from .models import User
from . import serializers
# 认证视图后端
from django.contrib.auth.backends import ModelBackend
from rest_framework.permissions import IsAuthenticated


class UsernameCountView(APIView):
    """
    查询用户名是否存在  查一个数据，根据主键做查询
    select count(*) from 表名 where username=***
    """

    def get(self,request,username):
        # 统计用户名个数
        count = User.objects.filter(username=username).count()
        # 响应
        return Response({
            'username':username,
            'count':count
        })


class MobileCountView(APIView):
    """
    查询手机号是否存在
    """

    def get(self,request,mobile):
        #统计手机号个数
        count = User.objects.filter(mobile=mobile).count()
        #响应
        return Response({
            'mobile':mobile,
            'count':count
        })


#CreateAPIView创建视图
class RegisterView(generics.CreateAPIView):
    """
    注册：创建新用户对象
    """
    # 指定查询集：当前只实现创建功能，不需要查询，可以不指定
    # 指定序列化器：验证接收的数据，创建
    serializer_class = serializers.UserRegisterSerializer


# 邮箱设置视图
class UserView(generics.RetrieveAPIView):
    # 需要登录
    permission_classes = [IsAuthenticated]


    serializer_class = serializers.UserSerializer

    # 不需要查询，而是获取当前登录的用户
    # queryset = User.objects.all().get(pk=)
    # 重写方法，不根据主键查询（默认是根据主键查询），而是从jwt中获取当前用户
    # get_object()方法：在retrieve、update、destroy内部会调用这个方法，获取单一对象，
    # 默认实现：从路径中读取pk，查询，得到单一对象
    # get_object()方法是在generics的GenericAPIView类中
    def get_object(self):
        # self 表示当前视图中的request参数中有一个属性是user  请求这个视图就需要登录
        # dev中异常处理的 JSONWebTokenAuthentication从请求报文头当中获取信息，验证是否正常
        # 查看过期时间有没有过期，根据解析载荷部分，拿到userid后查询得到对象，之后讲该对象附给request，找到user属性
        return self.request.user


# UpdateAPIView接收一个put方式的请求，进行处理修改
class EmailView(generics.UpdateAPIView):
    # 默认修改的逻辑：根据主键查询对象，在修改对象的属性，保存
    # queryset =
    serializer_class = serializers.UserEmailSerializer

    # 访问此视图时，必须先登录
    permission_classes = [IsAuthenticated]

    # 获取当前登录的用户对象，而不是根据主键查询
    def get_object(self):
        return self.request.user


class EmailActiveView(APIView):
    def get(self,request):
        #1.接收加密信息   查询字符串接收方式request.query_params.get
        token = request.query_params.get('token')

        #2.解密验证
        user = User.email_loads(token)
        if user is None:
            return Response({'message':'激活链接失败'})

        #3.查询用户对象，修改属性  有效--保存
        user.email_active = True
        user.save()

        #4.响应
        return Response({'message':'激活成功'})
